/*
 * @Author: 涵崽
 * @Date: 2024-02-28 11:33:17
 * @email: 1045654@qq.com
 * @gitee: https://gitee.com/han-zai
 * @LastEditors: 涵崽
 * @LastEditTime: 2024-02-28 12:04:13
 * @Description: 微信：1045654
 */

import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // 进度条
import 'nprogress/nprogress.css' // 进度条样式
import { getToken } from '@/utils/auth' // 获取token和语音
import getPageTitle from '@/utils/get-page-title' // 设置title

NProgress.configure({ showSpinner: false }) // 配置进度条

const whiteList = ['/login'] // 白名单

// 前置路由守卫
router.beforeEach(async(to, from, next) => {
  // 进度条开始
  NProgress.start()

  // 修改标题
  document.title = getPageTitle(to.meta.title)
  // 判断用户是否登录
  const hasToken = getToken()
  // 有token则表示已登录
  if (hasToken) {
    // 有token的情况下访问登录页
    if (to.path === '/login') {
      // 跳转到首页
      next({ path: '/' })
      // 关闭进度条
      NProgress.done()
    } else {
      // 判断用户是否有身份信息，并且路由的数量不等于三，这里的3是指静态路由。
      // 如果用户有身份信息，则会添加路由信息，没有添加动态路由的情况下路由数量才会是三
      const hasRoles = store.getters.roles && store.getters.roles.length > 0
      if (hasRoles && router.options.routes.length !== 3) {
        // 如果有身份，并且路由正常添加则放行
        next()
      } else {
        // 有身份信息的情况下，路由信息不正确
        try {
          // 第一步获取用户权限
          const { role } = await store.dispatch('user/getInfo')

          // 第二步 根据权限获取路由信息
          const accessRoutes = await store.dispatch(
            'permission/generateRoutes',
            role
          )

          // 第三步 更新路由
          /* 由于我们公司的登录逻辑是在登录时直接拿到用户所有的信息,
          所以这里ESLint检查一定会报错error  Possible race condition: `router.options.routes` might be reassigned based on an outdated value of `router.options.routes`
          虽然...但是...暂时还未发现对项目有什么影响,如果有哪位大哥有更好的思路麻烦大哥提个pr
           */
          router.options.routes = store.getters.permission_routes

          // 动态添加可访问路由
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })
          // next();
        } catch (error) {
          // 删除token并且提示错误
          await store.dispatch('user/resetToken')
          Message.error(error || 'Has Error')
          // next(`/login?redirect=${to.path}`);
          next()
          NProgress.done()
        }
      }
    }
  } else {
    // 没有token的情况下访问的是白名单中的路由则放行
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      // 重定向到登录页
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  // 关闭进度条
  NProgress.done()
})
